package org.remixlab.gnutopic.data;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

/**
 * Clase singleton que permite obtener los datos de un foro implementado en Zoho.
 * 
 * @author avelandia
 *
 */
public class ZohoProxy {
	
	private String apiKey;		//llave usada para conectarnos a zoho
	private String ticketId;	//el id se necesita para realizar cualquier operacion de conexi�n.
	private static ZohoProxy instance;	//instancia de la clase
	
	private String portalName;
	
	private ZohoProxy(){
		
		portalName = "gnutopic";
		
		//TODO por ahora pongo el key estatico 
		apiKey = "2f2e9b5c6efdfd7593c4cded629b8e43";
		
		//obtengo el ticket Id
		ticketId = getTicketId();
	}
	
	/**
	 * Método que obtiene el ticket
	 * @return
	 */
	private String getTicketId(){
		
		String result = "";
		
		//aqui se llama la url para obtener el ticketId y conectarse al foro
		String urlString = "https://accounts.zoho.com/login";
		
		//creo un hashMap donde voy a ingresar los par�metros
		HashMap <String, String> params = new HashMap <String, String >();
		
		//TODO falta leer el login de usuario
		params.put("LOGIN_ID", "amvm6837");
		
		//TODO falta leer el password
		params.put("PASSWORD", "4nDr3s2o10");
		
		params.put("FROM_AGENT", "true");
		
		params.put("servicename", "ZohoProjects");
		
		if(urlString!=null && urlString!=""){
			//Leo la cadena retornada...
			String htmlResult = readURL(urlString, params);
			
			//intento obtener el ticket
			result = getTicketId(htmlResult);
		}
		
		return result; 
	}
	
	/**
	 * Función encargada de obtener el ticket de zoho
	 * @param htmlResult el resultado de llamar la url.
	 * @return el ticket si se encuentra en la cadena recibida.
	 */
	private String getTicketId(String htmlResult) {
		//aqui debo parsear la cadena para obtener el ticket
		String result = "";
		
		int i = htmlResult.indexOf("TICKET=");
		
		//si la palabra TICKET= existe en la cadena, entonces..
		if(i>0){
			result = htmlResult.substring(i+"TICKET=".length());
			
			//obtengo el ticket ...
			int j = result.indexOf("\n");
			
			result = result.substring(0,j);	
		}
		
		System.out.println("El ticket es: "+result);
		
		return result;
	}

	public void getAllMessageCategories(){
		//si se tiene la llave y el ticket entonces...
		if((apiKey!=null && apiKey!="") &&
			(ticketId!=null && ticketId!="")){
			
			//debo llamar la url encargada de retornar las categorias del foro
			String urlString = "http://projects.zoho.com/portal/"+portalName+"/api/private/xml/message/getcateg?apikey="+apiKey+"&ticket="+ticketId;
			
			//creo un hashMap donde voy a ingresar los par�metros
			HashMap <String, String> params = new HashMap <String, String >();
			
			/*//agrego la llave
			params.put("apikey", apiKey);
			
			//agrego el ticket
			params.put("ticket", ticketId);*/
			
			params.put("projId", "");
			
			String htmlResult = readURL(urlString, params);
			
			System.out.println(htmlResult);
			
		}
	}
	
	
	/**
	 * Funci�n que se encarga de llamar la url y leer el resultado de dicho llamado
	 * @param url es la direcci�n web que se va a llamar
	 * @param params los par�metros a pasar a dicha url a trav�s del m�todo post
	 * @return Una cadena con el html leido
	 */
	public static String readURL(String urlString, Map<String, String> params){
		String result = "";
		
		InputStream inputStream;
		
		try {
			//creo un objeto de tipo url
			URL url = new URL(urlString);
			
			//creo un httpConection para solicitar la p�gina.
			HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
			
			//Cambio el metodo para que sea post...
			urlConnection.setRequestMethod("POST");
			
			if(params != null && !params.isEmpty()){
				//habilito el campo para poder enviar datos por post.
				urlConnection.setDoOutput(true);
				
				//leo el outputStream para escribir los datos.
				OutputStreamWriter out = new OutputStreamWriter(urlConnection.getOutputStream());
				
				//TODO aqui se deben escribir los datos recibidos
				
				Iterator<Entry<String, String>> iterator = params.entrySet().iterator();
				
				String parameters = "";
				
				while (iterator.hasNext()){
					//obtengo el entry
					Entry<String, String> entry = (Entry<String, String>) iterator.next();
					
					//codifico el par�metro a enviar.
					String value = URLEncoder.encode(entry.getValue(), "UTF-8");
					
					//env�o los campos con post
					if(parameters!=""){
						parameters = parameters +"&"+ entry.getKey()+"="+value;	
					}else{
						parameters = entry.getKey()+"="+value;	
					}
				}
				
				out.write(parameters);
				
				out.flush();
				
				//se cierra la conexi�n.
				out.close();
			}
			
			//obtengo el inputStream
			inputStream = urlConnection.getInputStream();
			
			//leo los caracteres..
			Reader charStream = new InputStreamReader(inputStream, "UTF-8");
			
			//leo lo que recib� del imputStream
			BufferedReader bufferReader = new BufferedReader(charStream);
			
			String line = "";
			
			while ((line=bufferReader.readLine())!=null){
				
				/*while(line.indexOf("&#")>0){
					String beginLine = line.substring(0, line.indexOf("&#"));
					String endLine = line.substring(line.indexOf("&#")+1);
					line = beginLine+"&amp;"+endLine;
				}*/
				
				result = result + line +"\n";
			}
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
		
		System.out.println("El resultado de llamar la URL es: " +result);
		
		return result;
		
	}
	
	
	/**
	 * M�todo encargado de retornar la instancia de la clase
	 * @return
	 */
	public static ZohoProxy getInstance(){
		
		if(instance==null){
			instance = new ZohoProxy();
		}
		
		return instance;
	}
	
	
	
	public static void main (String [] args){
		
		
		ZohoProxy.getInstance().getAllMessageCategories();
		
	}
	
	

}
